https://leetcode.cn/problems/max-consecutive-ones-iii/submissions/560518232/

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n = nums.size();  // 获取数组长度
        int zeroNum = 0;  // 记录当前窗口内的0的数量
        int i = 0;  // 右指针，用于扩展窗口
        int curOnesNum = 0;  // 当前窗口内1的数量
        int maxOnesNum = 0;  // 最大连续1的数量（允许翻转k个0）
        int j;  // 左指针，用于收缩窗口

        // 初始化窗口，找到第一个超过k个0的位置
        while (i < n && zeroNum <= k) {
            if (nums[i] == 0) {
                zeroNum++;  // 如果遇到0，增加零计数
            }
            if (zeroNum <= k) {
                i++;  // 如果零的数量不超过k，右指针继续前进
            }
        }

        j = 0;  // 初始化左指针
        curOnesNum = i - j;  // 当前窗口的大小
        maxOnesNum = curOnesNum;  // 更新最大值

        // 滑动窗口，寻找最长的包含最多k个0的子数组
        while (i < n && j <= i) {
            if (nums[j] == 0) {  // 如果左指针指向0
                i++;  // 右指针前进，因为左端出了一个0
                // 找到下一个0之前的所有1
                while (i < n && nums[i] == 1) {
                    i++;
                }
            }
            // 不论左指针指向的是0还是1，左指针都向右移动
            j++;
            curOnesNum = i - j;  // 更新当前窗口大小
            maxOnesNum = max(curOnesNum, maxOnesNum);  // 更新最大窗口大小
        }

        return maxOnesNum;  // 返回最大连续1的数量
    }
};